/**
 * 测试代付订单创建 API，追踪 bankCode 传递
 */

const API_BASE_URL = process.env.API_BASE_URL || 'http://localhost:3017';

interface LoginResponse {
  success: boolean;
  data?: {
    token: string;
    user: {
      id: number;
      username: string;
      email: string;
      role: string;
    };
  };
  message?: string;
}

interface CreatePayoutResponse {
  success: boolean;
  data?: any;
  message?: string;
}

async function login(email: string, password: string): Promise<string> {
  console.log('🔐 登录管理员账号...');
  console.log(`   Email: ${email}`);

  const response = await fetch(`${API_BASE_URL}/trpc/auth.login`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      email,
      password,
    }),
  });

  if (!response.ok) {
    throw new Error(`登录失败: ${response.status} ${response.statusText}`);
  }

  const apiResponse: any = await response.json();

  // tRPC 格式: { result: { data: { success, data, message } } }
  const result = apiResponse.result?.data || apiResponse;

  if (!result.success || !result.data?.token) {
    console.error('API 响应:', JSON.stringify(apiResponse, null, 2));
    throw new Error(`登录失败: ${result.message || '未返回token'}`);
  }

  console.log('✅ 登录成功');
  console.log(`   用户: ${result.data.user.username}`);
  console.log(`   角色: ${result.data.user.role}`);
  console.log(`   Token: ${result.data.token.substring(0, 20)}...\n`);

  return result.data.token;
}

async function createPayoutOrder(token: string, bankCode?: string): Promise<CreatePayoutResponse> {
  console.log('📝 创建代付订单...');
  console.log(`   支付渠道: LSPPAY`);
  console.log(`   支付方式: BankTransfer`);
  console.log(`   银行编码: ${bankCode || 'undefined'} ${bankCode ? '✅' : '❌'}`);
  console.log(`   金额: 100.00 THB`);

  const orderData = {
    paymentChannel: 'LSPPAY',
    paymentMethod: 'BankTransfer',
    uid: 'TEST_USER_001',
    amount: 100.00,
    receiverName: 'Test User',
    receiverBankCard: '1234567890123456',
    bankCode: bankCode,
    createdByName: 'Admin Test',
    remark: `测试代付订单 - ${bankCode ? '带' : '不带'}银行编码`,
  };

  console.log('\n📦 请求数据:');
  console.log(JSON.stringify(orderData, null, 2));

  const response = await fetch(`${API_BASE_URL}/trpc/payout.create`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`,
    },
    body: JSON.stringify(orderData),
  });

  if (!response.ok) {
    const errorText = await response.text();
    throw new Error(`创建订单失败: ${response.status} ${response.statusText}\n${errorText}`);
  }

  const apiResponse: any = await response.json();

  // tRPC 格式: { result: { data: { success, data, message } } }
  const result = apiResponse.result?.data || apiResponse;

  console.log('\n📨 API 响应:');
  console.log(JSON.stringify(result, null, 2));

  return result;
}

async function testPayoutAPI() {
  console.log('🧪 开始测试代付订单 API\n');
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');

  try {
    // 1. 登录获取 token
    const token = await login('admin@ordersystem.com', 'admin123456');

    // 2. 测试案例 1: 带银行编码
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
    console.log('📝 测试案例 1: 带银行编码创建订单');
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');

    const result1 = await createPayoutOrder(token, '002'); // 曼谷银行

    if (result1.success) {
      console.log('\n✅ 测试案例 1: 订单创建成功');
      console.log(`   订单ID: ${result1.data?.orderId}`);
      console.log(`   状态: ${result1.data?.status}`);
    } else {
      console.log(`\n⚠️  测试案例 1: 订单创建失败 - ${result1.message}`);
    }

    // 等待 3 秒
    console.log('\n⏳ 等待 3 秒...\n');
    await new Promise(resolve => setTimeout(resolve, 3000));

    // 3. 测试案例 2: 不带银行编码
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
    console.log('📝 测试案例 2: 不带银行编码创建订单');
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');

    const result2 = await createPayoutOrder(token, undefined);

    if (result2.success) {
      console.log('\n✅ 测试案例 2: 订单创建成功');
      console.log(`   订单ID: ${result2.data?.orderId}`);
      console.log(`   状态: ${result2.data?.status}`);
    } else {
      console.log(`\n⚠️  测试案例 2: 订单创建失败 - ${result2.message}`);
    }

    // 4. 总结
    console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
    console.log('📊 测试总结');
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');

    console.log('测试案例 1 (带银行编码 002):');
    console.log(`   状态: ${result1.success ? '✅ 成功' : '❌ 失败'}`);
    console.log(`   消息: ${result1.message || '无'}`);

    console.log('\n测试案例 2 (不带银行编码):');
    console.log(`   状态: ${result2.success ? '✅ 成功' : '❌ 失败'}`);
    console.log(`   消息: ${result2.message || '无'}`);

    console.log('\n💡 重要提示:');
    console.log('   请检查后端日志中的 LSPPAY签名生成 部分');
    console.log('   查看 stringA 中是否包含 bankCode 和 bankName 参数\n');

    console.log('✅ 测试完成!\n');

  } catch (error) {
    console.error('\n❌ 测试过程中出现错误:', error);
    if (error instanceof Error) {
      console.error('错误详情:', error.message);
    }
    process.exit(1);
  }
}

// 运行测试
testPayoutAPI().catch(error => {
  console.error('测试执行失败:', error);
  process.exit(1);
});